﻿// owner 蒋家伟

#pragma once
#include "DataStructureBase_home.h"

namespace jsdk
{
    // 类别描述 ：前缀树，用于快速字符串匹配
    // note : 依赖于字符串前缀，因此无法匹配重复的前缀字符串
    class DATASTRUCTUREBASE_EXPORT IPrefixTree
    {
    public:
        virtual ~IPrefixTree() {}

        static OwnerPtr<IPrefixTree> create();

        /// \ brief 添加待匹配的前缀
        /// \ in  prefixStr            前缀字符串
        /// \ out errorMsg             错误信息
        /// \ return true表示加入前缀成功,无错误信息， false表示加入失败，则错误信息有效
        virtual bool addPrefix(const std::wstring& prefixStr, std::wstring& errorMsg) = 0;

        /// \ brief 匹配字符串
        /// \ in matchedStr 待匹配的字符串
        /// \ return  多个匹配的节点, first uint32 表示起始下标，second uint32 表示匹配的长度。如果未匹配到任何字符则为空
        virtual std::vector<std::pair<uint32_t, uint32_t>> match(const std::wstring& matchStr) const = 0;

        /// \ brief 交换
        /// \ in opPrefixTree 前缀树指针
        virtual void swap(OwnerPtr<IPrefixTree>& opPrefixTree) = 0;

        /// \ brief 获取add成功的前缀个数
        /// \ return 个数
        virtual uint32_t getPrefixCount() const = 0;

        /// \ brief 获取所有的缓存的前缀
        /// \ return 所有add成功的前缀
        virtual std::vector<std::wstring> getPrefixStr() const = 0;
    };
}
